﻿Imports System.IO

Public Class csArchivos
    ''' <summary>
    ''' Funcion que valida que el archivo en la ruta sRuta exista y además que el archivo tenga la extensión sExtension
    ''' </summary>
    ''' <param name="sRuta">Ruta completa del archivo a verificar</param>
    ''' <param name="sExtension">Extensión del archivo que debe cumplir para que sea valido, por ejemplo (jpg, cer, xml, etc), sin el punto delimitante</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function existeArchivo(ByVal sRuta As String, ByVal sExtension As String) As Boolean
        If (File.Exists(sRuta)) Then
            If (Path.GetExtension(sRuta).ToLower = "." & sExtension.ToLower()) Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function

    ''' <summary>
    ''' Lee el contenido de un archivo en una variable String
    ''' </summary>
    ''' <param name="pathFile">String. Ruta completa del archivo a leer</param>
    ''' <param name="msError">String. Variable para retornar los errores que se encontraron al efectuar la operación</param>
    ''' <returns>String. El contenido del archivo <c>pathFile</c>
    ''' Si encontró algun error, regresa una cadena vacía y en <c>msError</c> la descripción del error encontrado
    ''' </returns>
    ''' <remarks></remarks>
    Public Shared Function leeArchivo(ByVal pathFile As String, ByRef msError As String) As String
        Dim ret As String = ""
        Try
            Using reader As StreamReader = New StreamReader(pathFile)
                ret = reader.ReadToEnd()
                reader.Close()
            End Using

            Return ret
        Catch ex As Exception
            Log.LogException(ex, "csArchivos.leeArchivo")
            msError = "Error al leer el archivo " & System.IO.Path.GetFileName(pathFile) & ":" & vbCrLf & ex.Message
            Return ""
        Finally
            ret = Nothing
        End Try
    End Function

    ''' <summary>
    ''' Función que verifica que un archivo de imagen exista, y tenga cualquiera de las siguientes extensiones: jpg, gif, bmp, png
    ''' </summary>
    ''' <param name="sRuta">Ruta absoluta del arhivo a evaluar</param>
    ''' <returns>
    ''' True: El archivo existe y es de imagen
    ''' False: El archivo no existe o no es de imagen
    ''' </returns>
    ''' <remarks></remarks>
    Public Shared Function existeImagen(ByVal sRuta As String) As Boolean
        If (File.Exists(sRuta)) Then
            If (System.IO.Path.GetExtension(sRuta).ToLower = ".jpg") Or (System.IO.Path.GetExtension(sRuta).ToLower = ".gif") _
             Or (System.IO.Path.GetExtension(sRuta).ToLower = ".bmp") Or (System.IO.Path.GetExtension(sRuta).ToLower = ".png") Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function

    Public Shared Function analizaArchivoDesocupadoMaxTiempo(ByVal pRutaArchivo As String) As Boolean
        Try
            Dim libre As Boolean = False
            Dim archivoGenerado As DateTime = DateTime.Now()
            While (True)
                If (csArchivos.archivoCreadoCompleto(pRutaArchivo)) Then
                    libre = True
                    Exit While
                End If
                'Calcula el tiempo transcurrido y si el periodo máximo de espera se ha alcanzado, retorna falso
                Dim timeElapsed As TimeSpan = DateTime.Now - archivoGenerado
                If (timeElapsed.TotalMinutes > 1) Then
                    libre = False
                    Exit While
                End If
                System.Threading.Thread.Sleep(3000)
            End While
            Return libre
        Catch ex As Exception
            Log.LogException(ex, "csArchivos.analizaArchivoDesocupadoMaxTiempo")
            Return False
        End Try
    End Function

    Public Shared Function archivoCreadoCompleto(ByVal pRutaArch As String) As Boolean
        'si el archivo puede ser abierto con acceso exclusivo, esto significa que el archivo
        'no esta siendo ocupado por otro proceso
        Try
            Using inputStream As System.IO.FileStream = System.IO.File.Open(pRutaArch, IO.FileMode.Open, _
                                                                            IO.FileAccess.Read, _
                                                                            IO.FileShare.None)
                Return True
            End Using
        Catch ex As Exception
            Log.LogException(ex, "csArchivos.archivoCreadoCompleto")
            Return False
        End Try
    End Function

    Public Shared Function escribeArchivoDesdeBytearray(ByVal pRuta As String, ByVal pNombreArchivo As String, ByVal pArchivoBytes As Byte()) As String
        If pArchivoBytes IsNot Nothing AndAlso Not String.IsNullOrEmpty(pNombreArchivo) AndAlso Directory.Exists(pRuta) Then
            System.IO.File.WriteAllBytes(Path.Combine(pRuta, pNombreArchivo), pArchivoBytes)
        End If
        If File.Exists(Path.Combine(pRuta, pNombreArchivo)) Then
            Return Path.Combine(pRuta, pNombreArchivo)
        Else
            Return ""
        End If
    End Function

    Public Shared Function leeArchivoEnByteArray(ByVal filename As String) As Byte()
        Try
            Return File.ReadAllBytes(filename)
        Catch ex As Exception
            Log.LogException(ex, "csArchivos.leeArchivoEnByteArray")
            Return Nothing
        End Try
    End Function
End Class
